package com.hk.core.authentication.api;

import com.hk.commons.util.ArrayUtils;

import java.util.Arrays;

/**
 * 此接口可获取当前登陆用户信息
 *
 * @author kevin
 * @date 2017年10月23日下午12:50:55
 */
public interface SecurityContext {

    /**
     * 获取当前登陆的用户
     *
     * @return {@link UserPrincipal}
     */
    default UserPrincipal getPrincipal() {
        return getPrincipalByType(UserPrincipal.class);
    }

    /**
     * 获取当前登陆的用户返回指定的类型
     */
    <T extends UserPrincipal> T getPrincipalByType(Class<T> type);

    /**
     * 当前用户是否有认证
     *
     * @return 认证返回true, 否则返回false
     */
    boolean isAuthenticated();

    /**
     * 判断当前登陆用户是否有任意指定权限
     */
    default boolean hasAnyPermission(String... permissions) {
        if (ArrayUtils.isEmpty(permissions)) {
            return false;
        }
        if (isAuthenticated()) {
            UserPrincipal principal = getPrincipal();
            return Arrays.stream(permissions).anyMatch(principal::hasPermission);
        }
        return false;
    }

    /**
     * 判断当前登陆用户是否有指定权限
     */
    default boolean hasPermission(String permission) {
        if (isAuthenticated()) {
            return getPrincipal().hasPermission(permission);
        }
        return false;
    }

    /**
     * 判断当前登陆用户是否有指定角色
     */
    default boolean hasRole(String role) {
        if (isAuthenticated()) {
            return getPrincipal().hasRole(role);
        }
        return false;
    }

    /**
     * 判断当前登陆用户是否有任意指定角色
     */
    default boolean hasAnyRole(String... roles) {
        if (ArrayUtils.isEmpty(roles)) {
            return false;
        }
        if (isAuthenticated()) {
            UserPrincipal principal = getPrincipal();
            return Arrays.stream(roles).anyMatch(principal::hasRole);
        }
        return false;
    }

}
